home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
boot
/
czesc_2
/
toolmanager
/
source
/
prefs
/
iconwindow.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-05-15
|
21KB
|
745 lines
/*
* iconwindow.c V2.1
*
* icon edit window handling
*
* (c) 1990-1993 Stefan Becker
*/
#include "ToolManagerConf.h"
/* Icon node */
struct IconNode {
struct Node in_Node;
ULONG in_Flags;
char *in_Exec;
char *in_Image;
char *in_Sound;
LONG in_XPos;
LONG in_YPos;
};
/* Window data */
static struct Gadget *gl; /* Gadget list */
static struct Window *w; /* Window */
static struct MsgPort *wp; /* Window user port */
static UWORD ww,wh; /* Window size */
static struct IconNode *CurrentNode;
static ULONG CurrentGadgetNum;
static BOOL ReqOpen;
static struct Requester DummyReq;
#define WINDOW_IDCMP (IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|BUTTONIDCMP|\
CHECKBOXIDCMP|STRINGIDCMP|TEXTIDCMP|IDCMP_VANILLAKEY)
/* Gadget data */
#define GAD_NAME_STR 0 /* Gadgets with labels */
#define GAD_EXEC_BUT 1
#define GAD_IMAGE_BUT 2
#define GAD_SOUND_BUT 3
#define GAD_XPOS_INT 4
#define GAD_YPOS_INT 5
#define GAD_EXEC_TXT 6
#define GAD_IMAGE_TXT 7
#define GAD_SOUND_TXT 8
#define GAD_POSITION 9 /* Cycle gadget */
#define GAD_SHOWNAME 10 /* Checkbox gadget */
#define GAD_OK 11
#define GAD_CANCEL 12
#define GADGETS 13
static struct GadgetData gdata[GADGETS];
/* Gadget tags */
static struct TagItem nametags[]={GTST_String, NULL,
GTST_MaxChars, SGBUFLEN,
TAG_DONE};
static struct TagItem exectags[]={GTTX_Text, NULL,
GTTX_Border, TRUE,
TAG_DONE};
static struct TagItem imagetags[]={GTTX_Text, NULL,
GTTX_Border, TRUE,
TAG_DONE};
static struct TagItem soundtags[]={GTTX_Text, NULL,
GTTX_Border, TRUE,
TAG_DONE};
static char *cyclelabels[3]={NULL, NULL, NULL};
static struct TagItem cycletags[]={GTCY_Labels, (ULONG) cyclelabels,
GTCY_Active, 0,
TAG_DONE};
static struct TagItem xpostags[]={GTIN_Number, 0,
GTIN_MaxChars, 10,
TAG_DONE};
static struct TagItem ypostags[]={GTIN_Number, 0,
GTIN_MaxChars, 10,
TAG_DONE};
static struct TagItem showntags[]={GTCB_Checked, FALSE,
GTCB_Scaled, TRUE,
TAG_DONE};
/* Gadget vanilla key data */
#define KEY_NAME 0
#define KEY_EXEC 1
#define KEY_IMAGE 2
#define KEY_SOUND 3
#define KEY_XPOS 4
#define KEY_YPOS 5
#define KEY_SHOW 6
#define KEY_OK 7
#define KEY_CANCEL 8
static char KeyArray[KEY_CANCEL+1];
/* Init icon edit window */
void InitIconEditWindow(UWORD left, UWORD fheight)
{
ULONG labwidth,gadwidth,cycwidth,cbwidth,butwidth;
ULONG strheight=fheight+2;
ULONG i,tmp,yadd;
struct GadgetData *gd;
/* Init strings */
gdata[GAD_NAME_STR].name =AppStrings[MSG_WINDOW_NAME_GAD];
gdata[GAD_EXEC_BUT].name =AppStrings[MSG_WINDOW_EXEC_GAD];
gdata[GAD_IMAGE_BUT].name =AppStrings[MSG_WINDOW_IMAGE_GAD];
gdata[GAD_SOUND_BUT].name =AppStrings[MSG_WINDOW_SOUND_GAD];
gdata[GAD_XPOS_INT].name =AppStrings[MSG_WINDOW_LEFTEDGE_GAD];
gdata[GAD_YPOS_INT].name =AppStrings[MSG_WINDOW_TOPEDGE_GAD];
cyclelabels[0] =AppStrings[MSG_WINDOW_POSITION_OPEN_LABEL];
cyclelabels[1] =AppStrings[MSG_WINDOW_POSITION_CLOSE_LABEL];
gdata[GAD_SHOWNAME].name =AppStrings[MSG_ICONWIN_SHOWNAME_GAD];
gdata[GAD_OK].name =AppStrings[MSG_WINDOW_OK_GAD];
gdata[GAD_CANCEL].name =AppStrings[MSG_WINDOW_CANCEL_GAD];
/* Calculate maximum label width for string gadgets */
labwidth=0;
gd=&gdata[GAD_NAME_STR];
for (i=GAD_NAME_STR; i<=GAD_YPOS_INT; i++, gd++)
if ((tmp=TextLength(&TmpRastPort,gd->name,strlen(gd->name))) > labwidth)
labwidth=tmp;
labwidth+=2*INTERWIDTH;
/* Calculate minimum string gadget width */
gadwidth=TextLength(&TmpRastPort,AppStrings[MSG_ICONWIN_NEWNAME],
strlen(AppStrings[MSG_ICONWIN_NEWNAME]))+2*INTERWIDTH;
/* Calculate minimum window width */
ww=labwidth+gadwidth+2*INTERWIDTH;
/* Calculate maximum cyclegadget width */
{
char **s;
cycwidth=0;
s=cyclelabels;
for (i=0; i<=1; i++, s++)
if ((tmp=TextLength(&TmpRastPort,*s,strlen(*s))) > cycwidth)
cycwidth=tmp;
cycwidth+=5*INTERWIDTH;
}
if ((tmp=cycwidth+INTERWIDTH) > ww) ww=tmp;
/* Calculate checkbox label width */
gd=&gdata[GAD_SHOWNAME];
cbwidth=TextLength(&TmpRastPort,gd->name,strlen(gd->name))+INTERWIDTH
+CHECKBOX_WIDTH;
if ((tmp=cbwidth+INTERWIDTH) > ww) ww=tmp;
/* Calculate button gadgets width */
gd=&gdata[GAD_OK];
butwidth=TextLength(&TmpRastPort,gd->name,strlen(gd->name));
gd++;
if ((tmp=TextLength(&TmpRastPort,gd->name,strlen(gd->name))) > butwidth)
butwidth=tmp;
butwidth+=2*INTERWIDTH;
if ((tmp=2*(butwidth+INTERWIDTH)) > ww) ww=tmp;
/* window height */
wh=9*fheight+9*INTERHEIGHT+12;
if (!OSV39) wh+=INTERHEIGHT;
/* Init gadgets */
gd=gdata;
tmp=WindowTop+INTERHEIGHT;
gadwidth=ww-labwidth-2*INTERWIDTH; /* String gadget width */
i=labwidth;
labwidth+=left+INTERWIDTH;
yadd=strheight+INTERHEIGHT;
/* Name string gadget */
gd->type=STRING_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=nametags;
gd->left=labwidth;
gd->top=tmp;
gd->width=gadwidth;
gd->height=strheight;
tmp+=yadd;
/* Exec object button gadget */
gd++;
gd->type=BUTTON_KIND;
gd->flags=PLACETEXT_IN;
gd->left=left;
gd->top=tmp;
gd->width=i;
gd->height=strheight;
tmp+=yadd;
/* Image object button gadget */
gd++;
gd->type=BUTTON_KIND;
gd->flags=PLACETEXT_IN;
gd->left=left;
gd->top=tmp;
gd->width=i;
gd->height=strheight;
tmp+=yadd;
/* Sound object button gadget */
gd++;
gd->name=AppStrings[MSG_WINDOW_SOUND_GAD];
gd->type=BUTTON_KIND;
gd->flags=PLACETEXT_IN;
gd->left=left;
gd->top=tmp;
gd->width=i;
gd->height=strheight;
tmp+=yadd+fheight+INTERHEIGHT;
/* Leftedge integer gadget */
gd++;
gd->type=INTEGER_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=xpostags;
gd->left=labwidth;
gd->top=tmp;
gd->width=gadwidth;
gd->height=strheight;
tmp+=yadd;
/* TopEdge integer gadget */
gd++;
gd->type=INTEGER_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=ypostags;
gd->left=labwidth;
gd->top=tmp;
gd->width=gadwidth;
gd->height=strheight;
/* Exec object text gadget */
tmp=WindowTop+yadd+INTERHEIGHT;
gd++;
gd->type=TEXT_KIND;
gd->tags=exectags;
gd->left=labwidth;
gd->top=tmp;
gd->width=gadwidth;
gd->height=strheight;
tmp+=yadd;
/* Image object text gadget */
gd++;
gd->type=TEXT_KIND;
gd->tags=imagetags;
gd->left=labwidth;
gd->top=tmp;
gd->width=gadwidth;
gd->height=strheight;
tmp+=yadd;
/* Sound object text gadget */
gd++;
gd->type=TEXT_KIND;
gd->tags=soundtags;
gd->left=labwidth;
gd->top=tmp;
gd->width=gadwidth;
gd->height=strheight;
tmp+=yadd;
/* Position cycle gadget */
gd++;
gd->type=CYCLE_KIND;
gd->flags=PLACETEXT_IN;
gd->tags=cycletags;
gd->left=left;
gd->top=tmp;
gd->width=ww-INTERWIDTH;
gd->height=fheight;
/* Showname checkbox gadget */
tmp=WindowTop+7*fheight+8*INTERHEIGHT+12;
gd++;
gd->type=CHECKBOX_KIND;
gd->flags=PLACETEXT_RIGHT;
gd->tags=showntags;
gd->left=(ww-cbwidth-INTERWIDTH)/2+left;
gd->top=tmp;
gd->width=CHECKBOX_WIDTH;
gd->height=fheight-INTERHEIGHT;
tmp+=fheight;
if (!OSV39) tmp+=INTERHEIGHT;
/* OK button gadget */
gd++;
gd->type=BUTTON_KIND;
gd->flags=PLACETEXT_IN;
gd->left=left;
gd->top=tmp;
gd->width=butwidth;
gd->height=fheight;
/* Cancel button gadget */
gd++;
gd->type=BUTTON_KIND;
gd->flags=PLACETEXT_IN;
gd->left=ww-butwidth-INTERWIDTH+left;
gd->top=tmp;
gd->width=butwidth;
gd->height=fheight;
/* Init vanilla key array */
KeyArray[KEY_NAME] =FindVanillaKey(gdata[GAD_NAME_STR].name);
KeyArray[KEY_EXEC] =FindVanillaKey(gdata[GAD_EXEC_BUT].name);
KeyArray[KEY_IMAGE] =FindVanillaKey(gdata[GAD_IMAGE_BUT].name);
KeyArray[KEY_SOUND] =FindVanillaKey(gdata[GAD_SOUND_BUT].name);
KeyArray[KEY_XPOS] =FindVanillaKey(gdata[GAD_XPOS_INT].name);
KeyArray[KEY_YPOS] =FindVanillaKey(gdata[GAD_YPOS_INT].name);
KeyArray[KEY_SHOW] =FindVanillaKey(gdata[GAD_SHOWNAME].name);
KeyArray[KEY_OK] =FindVanillaKey(gdata[GAD_OK].name);
KeyArray[KEY_CANCEL]=FindVanillaKey(gdata[GAD_CANCEL].name);
/* Init dummy requester structure */
InitRequester(&DummyReq);
}
/* Free icon node */
void FreeIconNode(struct Node *node)
{
struct IconNode *in=(struct IconNode *) node;
char *s;
if (s=in->in_Node.ln_Name) free(s);
if (s=in->in_Exec) free(s);
if (s=in->in_Image) free(s);
if (s=in->in_Sound) free(s);
/* Free node */
FreeMem(in,sizeof(struct IconNode));
}
/* Copy image node */
struct Node *CopyIconNode(struct Node *node)
{
struct IconNode *in,*orignode=(struct IconNode *) node;
/* Alloc memory for icon node */
if (in=AllocMem(sizeof(struct IconNode),MEMF_PUBLIC|MEMF_CLEAR)) {
/* Got an old node? */
if (orignode) {
/* Yes, copy it */
if ((!orignode->in_Node.ln_Name || (in->in_Node.ln_Name=
strdup(orignode->in_Node.ln_Name))) &&
(!orignode->in_Exec || (in->in_Exec=strdup(orignode->in_Exec))) &&
(!orignode->in_Image || (in->in_Image=strdup(orignode->in_Image))) &&
(!orignode->in_Sound || (in->in_Sound=strdup(orignode->in_Sound)))) {
/* Copy flags & numbers */
in->in_Flags=orignode->in_Flags;
in->in_XPos=orignode->in_XPos;
in->in_YPos=orignode->in_YPos;
return(in);
}
} else
/* No, set defaults */
if (in->in_Node.ln_Name=strdup(AppStrings[MSG_ICONWIN_NEWNAME])) {
/* Set flags */
in->in_Flags=ICPOF_SHOWNAME;
/* Return pointer to new node */
return(in);
}
FreeIconNode((struct Node *) in);
}
/* Call failed */
return(NULL);
}
/* Create icon node from string */
struct Node *CreateIconNode(char *name)
{
struct IconNode *in;
/* Alloc memory for icon node */
if (in=AllocMem(sizeof(struct IconNode),MEMF_PUBLIC|MEMF_CLEAR)) {
/* Init node */
if ((in->in_Node.ln_Name=strdup(name)) &&
(in->in_Exec=strdup(name)) &&
(in->in_Image=strdup(name))) {
/* Set flags */
in->in_Flags=ICPOF_SHOWNAME;
/* All OK. */
return(in);
}
FreeIconNode((struct Node *) in);
}
/* Call failed */
return(NULL);
}
/* Activate gadget and save pointer to it */
static void MyActivateGadget(ULONG num)
{
ActivateGadget(gdata[num].gadget,w,NULL);
}
/* Open icon edit window */
BOOL OpenIconEditWindow(struct Node *node, struct Window *parent)
{
/* Copy node */
if (CurrentNode=(struct IconNode *) CopyIconNode(node)) {
/* Set tags */
nametags[0].ti_Data=(ULONG) CurrentNode->in_Node.ln_Name;
exectags[0].ti_Data=(ULONG) CurrentNode->in_Exec;
imagetags[0].ti_Data=(ULONG) CurrentNode->in_Image;
soundtags[0].ti_Data=(ULONG) CurrentNode->in_Sound;
xpostags[0].ti_Data=CurrentNode->in_XPos;
ypostags[0].ti_Data=CurrentNode->in_YPos;
showntags[0].ti_Data=(CurrentNode->in_Flags & ICPOF_SHOWNAME)!=0;
/* Create gadgets */
if (gl=CreateGadgetList(gdata,GADGETS)) {
/* Open window */
if (w=OpenWindowTags(NULL,WA_Left, parent->LeftEdge,
WA_Top, parent->TopEdge+WindowTop,
WA_InnerWidth, ww,
WA_InnerHeight, wh,
WA_AutoAdjust, TRUE,
WA_Title, AppStrings[MSG_ICONWIN_TITLE],
WA_PubScreen, PublicScreen,
WA_Flags, WFLG_CLOSEGADGET|WFLG_DRAGBAR|
WFLG_DEPTHGADGET|WFLG_RMBTRAP|
WFLG_ACTIVATE,
TAG_DONE)) {
/* Add gadgets to window */
AddGList(w,gl,(UWORD) -1,(UWORD) -1,NULL);
RefreshGList(gl,w,NULL,(UWORD) -1);
GT_RefreshWindow(w,NULL);
/* Activate name string gadget */
MyActivateGadget(GAD_NAME_STR);
/* Set local variables */
w->UserPort=IDCMPPort;
w->UserData=(BYTE *) HandleIconEditWindowIDCMP;
ModifyIDCMP(w,WINDOW_IDCMP);
CurrentWindow=w;
ReqOpen=FALSE;
/* All OK. */
return(TRUE);
}
FreeGadgets(gl);
}
FreeIconNode((struct Node *) CurrentNode);
}
/* Call failed */
return(FALSE);
}
/* Close icon edit window */
static void CloseIconEditWindow(void)
{
/* Free resources */
if (MoveWindowPtr) CloseMoveWindow();
RemoveGList(w,gl,(UWORD) -1);
CloseWindowSafely(w);
FreeGadgets(gl);
}
/* If move window open, move it to new position */
static void MoveMoveWindow(void)
{
/* Move window open? */
if (MoveWindowPtr) {
ULONG x,y;
/* Read current position */
x=((struct StringInfo *) gdata[GAD_XPOS_INT].gadget->SpecialInfo)->LongInt;
y=((struct StringInfo *) gdata[GAD_YPOS_INT].gadget->SpecialInfo)->LongInt;
/* Move move window */
MoveWindow(MoveWindowPtr,x-MoveWindowPtr->LeftEdge+WBXOffset,
y-MoveWindowPtr->TopEdge+WBYOffset);
}
}
/* Exec, Image & Sound button gadget function */
static void TextButtonGadgetFunc(ULONG gadnum, ULONG listnum)
{
if (!ReqOpen) {
/* Save gadget number */
CurrentGadgetNum=gadnum;
/* Open list requester */
if (OpenListRequester(listnum,w)) {
/* Disable window */
DisableWindow(w,&DummyReq);
/* Set update function */
UpdateWindow=UpdateIconEditWindow;
ReqOpen=TRUE;
}
}
}
/* OK gadget function */
static struct Node *OKGadgetFunc(void)
{
struct Node *rc;
char *s;
/* Free old string */
if (s=CurrentNode->in_Node.ln_Name) free(s);
/* Duplicate new string */
if ((CurrentNode->in_Node.ln_Name=
DuplicateBuffer(gdata[GAD_NAME_STR].gadget)) != (char *) -1) {
/* Copy integer gadget values */
CurrentNode->in_XPos=
((struct StringInfo *) gdata[GAD_XPOS_INT].gadget->SpecialInfo)->LongInt;
CurrentNode->in_YPos=
((struct StringInfo *) gdata[GAD_YPOS_INT].gadget->SpecialInfo)->LongInt;
rc=(struct Node *) CurrentNode;
} else {
/* Couldn't copy strings */
rc=(struct Node *) -1;
FreeIconNode((struct Node *) CurrentNode);
}
return(rc);
}
/* Handle icon edit window IDCMP events */
void *HandleIconEditWindowIDCMP(struct IntuiMessage *msg)
{
struct Node *NewNode=NULL;
/* Which IDCMP class? */
switch (msg->Class) {
case IDCMP_CLOSEWINDOW: NewNode=(struct Node *) -1;
FreeIconNode((struct Node *) CurrentNode);
break;
case IDCMP_REFRESHWINDOW: GT_BeginRefresh(w);
GT_EndRefresh(w,TRUE);
break;
case IDCMP_GADGETUP:
switch (((struct Gadget *) msg->IAddress)->GadgetID) {
case GAD_EXEC_BUT: TextButtonGadgetFunc(GAD_EXEC_TXT,LISTREQ_EXEC);
break;
case GAD_IMAGE_BUT: TextButtonGadgetFunc(GAD_IMAGE_TXT,LISTREQ_IMAGE);
break;
case GAD_SOUND_BUT: TextButtonGadgetFunc(GAD_SOUND_TXT,LISTREQ_SOUND);
break;
case GAD_XPOS_INT: MoveMoveWindow();
break;
case GAD_YPOS_INT: MoveMoveWindow();
break;
case GAD_POSITION: /* Move window open? */
if (MoveWindowPtr)
/* Yes. Close move window */
CloseMoveWindow();
else {
/* No. Open it! */
MoveWindowOffX=WBXOffset;
MoveWindowOffY=WBYOffset;
/* Open move window */
OpenMoveWindow(w,gdata[GAD_XPOS_INT].gadget,
gdata[GAD_YPOS_INT].gadget);
}
break;
case GAD_SHOWNAME: /* Toggle flag */
CurrentNode->in_Flags^=ICPOF_SHOWNAME;
break;
case GAD_OK: NewNode=OKGadgetFunc();
break;
case GAD_CANCEL: NewNode=(struct Node *) -1;
FreeIconNode((struct Node *) CurrentNode);
break;
}
break;
case IDCMP_VANILLAKEY:
switch (MatchVanillaKey(msg->Code,KeyArray)) {
case KEY_NAME: MyActivateGadget(GAD_NAME_STR);
break;
case KEY_EXEC: TextButtonGadgetFunc(GAD_EXEC_TXT,LISTREQ_EXEC);
break;
case KEY_IMAGE: TextButtonGadgetFunc(GAD_IMAGE_TXT,LISTREQ_IMAGE);
break;
case KEY_SOUND: TextButtonGadgetFunc(GAD_SOUND_TXT,LISTREQ_SOUND);
break;
case KEY_XPOS: MyActivateGadget(GAD_XPOS_INT);
break;
case KEY_YPOS: MyActivateGadget(GAD_YPOS_INT);
break;
case KEY_SHOW: /* Toggle flag */
CurrentNode->in_Flags^=ICPOF_SHOWNAME;
/* Set check box gadget */
GT_SetGadgetAttrs(gdata[GAD_SHOWNAME].gadget,w,NULL,
GTCB_Checked, (CurrentNode->in_Flags & ICPOF_SHOWNAME),
TAG_DONE);
break;
case KEY_OK: NewNode=OKGadgetFunc();
break;
case KEY_CANCEL: NewNode=(struct Node *) -1;
FreeIconNode((struct Node *) CurrentNode);
break;
}
break;
}
/* Close window? */
if (NewNode) {
/* Yes. But first reply message!!! */
GT_ReplyIMsg(msg);
CloseIconEditWindow();
}
return(NewNode);
}
/* Update Icon edit window */
void UpdateIconEditWindow(void *data)
{
/* Got data? */
if (data != LREQRET_CANCEL) {
char *new;
/* Selected something? */
new=(data == LREQRET_NOSELECT) ? NULL : ((struct Node *) data)->ln_Name;
/* Duplicate name */
if (!new || (new=strdup(new))) {
char *old;
/* Which object? */
switch (CurrentGadgetNum) {
case GAD_EXEC_TXT: /* Set new Exec name */
old=CurrentNode->in_Exec;
CurrentNode->in_Exec=new;
break;
case GAD_IMAGE_TXT: /* Set new Image name */
old=CurrentNode->in_Image;
CurrentNode->in_Image=new;
break;
case GAD_SOUND_TXT: /* Set new Sound name */
old=CurrentNode->in_Sound;
CurrentNode->in_Sound=new;
break;
}
/* Free old string */
if (old) free(old);
/* Set new text */
GT_SetGadgetAttrs(gdata[CurrentGadgetNum].gadget,w,NULL,GTTX_Text,new,
TAG_DONE);
}
}
/* Enable window */
EnableWindow(w,&DummyReq,WINDOW_IDCMP);
/* Restore update function pointer */
UpdateWindow=UpdateMainWindow;
CurrentWindow=w;
ReqOpen=FALSE;
}
/* Read TMIC IFF chunk into Icon node */
struct Node *ReadIconNode(UBYTE *buf)
{
struct IconNode *in;
/* Allocate memory for node */
if (in=AllocMem(sizeof(struct IconNode),MEMF_PUBLIC|MEMF_CLEAR)) {
struct IconPrefsObject *ipo=(struct IconPrefsObject *) buf;
ULONG sbits=ipo->ipo_StringBits;
UBYTE *ptr=(UBYTE *) &ipo[1];
if ((!(sbits & ICPO_NAME) || (in->in_Node.ln_Name=GetConfigStr(&ptr))) &&
(!(sbits & ICPO_EXEC) || (in->in_Exec=GetConfigStr(&ptr))) &&
(!(sbits & ICPO_IMAGE) || (in->in_Image=GetConfigStr(&ptr))) &&
(!(sbits & ICPO_SOUND) || (in->in_Sound=GetConfigStr(&ptr)))) {
/* Copy flags & values */
in->in_Flags=ipo->ipo_Flags;
in->in_XPos=ipo->ipo_XPos;
in->in_YPos=ipo->ipo_YPos;
/* All OK. */
return(in);
}
/* Call failed */
FreeIconNode((struct Node *) in);
}
return(NULL);
}
/* Write Icon node to TMIC IFF chunk */
BOOL WriteIconNode(struct IFFHandle *iff, UBYTE *buf, struct Node *node)
{
struct IconNode *in=(struct IconNode *) node;
struct IconPrefsObject *ipo=(struct IconPrefsObject *) buf;
ULONG sbits=0;
UBYTE *ptr=(UBYTE *) &ipo[1];
/* Copy strings */
if (PutConfigStr(in->in_Node.ln_Name,&ptr)) sbits|=ICPO_NAME;
if (PutConfigStr(in->in_Exec,&ptr)) sbits|=ICPO_EXEC;
if (PutConfigStr(in->in_Image,&ptr)) sbits|=ICPO_IMAGE;
if (PutConfigStr(in->in_Sound,&ptr)) sbits|=ICPO_SOUND;
/* set string bits */
ipo->ipo_StringBits=sbits;
/* Copy flags & values */
ipo->ipo_Flags=in->in_Flags;
ipo->ipo_XPos=in->in_XPos;
ipo->ipo_YPos=in->in_YPos;
/* calculate length */
sbits=ptr-buf;
DEBUG_PRINTF("chunk size %ld\n",sbits);
/* Open chunk */
if (PushChunk(iff,0,ID_TMIC,sbits)) return(FALSE);
/* Write chunk */
if (WriteChunkBytes(iff,buf,sbits)!=sbits) return(FALSE);
/* Close chunk */
if (PopChunk(iff)) return(FALSE);
/* All OK. */
return(TRUE);
}